package ar.edu.unq.edp.futbol.usuarios;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import unq.equipos.dom.partidos.PartidoCopa;
import unq.equipos.dom.partidos.PartidoSimple;

public class UsuarioConsultor extends Usuario {
	
	private String ganador;
	
	private String equipo1;
	private String equipo2;

	public UsuarioConsultor(String equipo1, String equipo2) {
		this.equipo1 = equipo1;
		this.equipo2 = equipo2;
	}

	@Override
	public void run(){
//		consultarPartidosSimples();
		consultarPartidosCopa();
	}

	/**
	 * Falta hacer que consulte sobre todos los partidos cual es el equipo que mas gano
	 */
	protected void consultarPartidosCopa() {
		List<PartidoCopa> partidos = this.buscarCupMatches(this.equipo1, this.equipo2);
		partidos.addAll(buscarCupMatches(equipo2, equipo1));
		int ganadosPorEquipo1 = cupFilter(partidos,equipo1);
		int ganadosPorEquipo2 = cupFilter(partidos, equipo2);
		printDatos(equipo1,equipo2, ganadosPorEquipo1 ,ganadosPorEquipo2, 0);
		this.setGanador(ganadosPorEquipo1 > ganadosPorEquipo2 ? equipo1:equipo2); 
		
	}

	private int cupFilter(List<PartidoCopa> partidos, String equipo) {
		int ganadas = 0;
		for(PartidoCopa current : partidos){
			if (current.equipoGanador().getNombre().equals(equipo))
					ganadas++;		
		}
		return ganadas;
	}

	private void consultarPartidosSimples() {
		List<PartidoSimple> partidos = this.buscarMatch(this.equipo1, this.equipo2);
		partidos.addAll(buscarMatch(equipo2, equipo1));
		int ganadosPorEquipo1 = simpleFilter(partidos,equipo1);
		int ganadosPorEquipo2 = simpleFilter(partidos,equipo2);
		int empates = partidos.size() - (ganadosPorEquipo1+ganadosPorEquipo2);
		printDatos(equipo1,equipo2, ganadosPorEquipo1 ,ganadosPorEquipo2,empates);
	}

	private void printDatos(String equipo1,String equipo2,int ganadosPorEquipo1, int ganadosPorEquipo2,
			int empates) {
		System.out.println("La cantidad de partidos ganados de "+equipo1+" son : "+ganadosPorEquipo1);
		System.out.println("La cantidad de partidos ganados de "+equipo2+" son : "+ganadosPorEquipo2);
		System.out.println("La cantidad de empates entre :"+equipo1 +" y "+equipo2+" son "+empates);
	}

	private int simpleFilter(List<PartidoSimple> partidos, String equipo) {
		int ganadas = 0;
		for(PartidoSimple current : partidos){
			if (current.getEquipoUno().getNombre().equals(equipo) &&
				current.getGolesEquipoLocal() > current.getGolesEquipoVisitante())
					ganadas++;			
			if (current.getEquipoDos().getNombre().equals(equipo) &&
				  current.getGolesEquipoVisitante() > current.getGolesEquipoLocal())
					ganadas++;
		}
		return ganadas;
	}

	@SuppressWarnings("unchecked")
	private List<PartidoSimple> buscarMatch(String equipo1, String equipo2) {
		Session session = pedirSesion();
		SacadorDeEquipo sacadorEquipoUno = new SacadorDeEquipo(equipo1,null);
		SacadorDeEquipo sacadorEquipoDos = new SacadorDeEquipo(equipo2,null);
		Criteria criteria = session.createCriteria(PartidoSimple.class);
		criteria.add(Restrictions.like("equipoUno",sacadorEquipoUno.ejecutarTarea(session)));
		criteria.add(Restrictions.like("equipoDos",sacadorEquipoDos.ejecutarTarea(session)));
		criteria.setCacheable(true);
		return criteria.list();	
	}
	
	@SuppressWarnings("unchecked")
	private List<PartidoCopa> buscarCupMatches(String equipo1, String equipo2){
		Session session = pedirSesion();
		SacadorDeEquipo sacadorEquipoDos = new SacadorDeEquipo(equipo2,null);
		SacadorDeEquipo sacadorEquipoUno = new SacadorDeEquipo(equipo1,null);
		Criteria criteria = session.createCriteria(PartidoCopa.class);
		criteria.add(Restrictions.like("equipoUno",sacadorEquipoUno.ejecutarTarea(session)));
		criteria.add(Restrictions.like("equipoDos",sacadorEquipoDos.ejecutarTarea(session)));
		criteria.setCacheable(true);
		return criteria.list();
	}

	public void setGanador(String ganador) {
		this.ganador = ganador;
	}

	public String getGanador() {
		return ganador;
	}

}
